package main

import (
	"fmt"
	"strconv"
	"strings"
)

// n的阶乘函数
func factorial(n int) int {
	if n == 1 {
		return 1
	}

	return n * factorial(n-1)
}

// 闭包函数+递归方式输出三角
func triangle(n uint) {
	//总行是n
	//当前行数值从1开始，每行加 n 代表行
	//有n-i个tab要打印，i代表要打印多少数字
	var i uint = 1
	var inner = func() {
		//循环输出空格
		//判断n决定输出多少行，循环输出空格
		//1. 判断数字宽度，空格数量=数字最大宽度+1
		intLen := len([]byte(strconv.Itoa(int(n))))
		for k := n - i; k >= 1; k-- {
			fmt.Print(strings.Repeat(" ", intLen+1))
		}
		//循环输出数字
		for j := i; j >= 1; j = j - 1 {
			l := len([]byte(strconv.Itoa(int(j))))
			if j == 1 {
				//打印空格长度=总长度-数字长度
				fmt.Print(strings.Repeat(" ", intLen+1-l))
				fmt.Printf("%d\n", j)
			} else {
				// 打印空格
				fmt.Print(strings.Repeat(" ", intLen+1-l))
				//打印数字
				fmt.Printf("%d", j)
			}
		}
	}
	for l := n; l >= 1; l-- {
		inner()
		i++
	}
}

func main() {
	//计算n的阶乘
	fmt.Printf("阶乘结果为：%+v\n", factorial(9))
	//画三角
	triangle(9)
}


// 批改意见
// 1. 阶乘没有考虑n=0或n<0的特殊情况